/**#################################################↓↓↓↓↓命令相关↓↓↓↓↓######################################################## */
//#region 命令相关

/**全局参数模型 */
export interface IGlobal {
  /**服务程序地址 */
  service: string;
  /**运行脚本地址 */
  script: string;
  /**文件地址 */
  addr: string;
  /**生成目录 */
  dir: string;
  /**命令名称 */
  cmdName: string;
  /**命令脚本地址 */
  cmdPath: string;
  /**项目工作地址 */
  workPath: string;
  /**本地API目录地址 */
  apiPath: string;
  /**书写器名称 */
  writerName: string;
  /**本地Swagger文件地址 */
  swgFile: string;
  /**服务器Swagger下载地址 */
  swgUrl: string;
  /**Swagger对象数据 */
  swgJson: ISwagger;
  /**命令生成名称 */
  apiName: string;
  /**授权账号 */
  authUser: string;
  /**授权密码 */
  authPass: string;
  /**是否离线发布 */
  offline: boolean;
  /**解析结果 */
  result: IParsedResult;
}

/**#################################################↑↑↑↑↑命令相关↑↑↑↑↑######################################################## */
/**#################################################↓↓↓↓↓请求相关↓↓↓↓↓######################################################## */
//#region 请求相关

/**基础授权信息 */
export interface MHttpBaseAuth {
  /**用户名 */
  user: string;
  /**密码 */
  pass: string;
}

/**请求基础配置 */
export interface MHttpSets {
  /**请求域名 */
  base?: string;
  /**超时时间 */
  timeout?: number;
  /**基础授权信息 */
  baseAuth?: MHttpBaseAuth;
  /**请求头 */
  headers?: Record<string, any>;
}

/**请求配置 */
export interface MHttpConfig extends MHttpSets {
  /**请求地址 */
  url?: string | URL;
  /**请求方式 */
  method?: string;
  /**提交内容 */
  data?: any;
  /**请求参数 */
  pararms?: Record<string, any>;
}

/**请求结果 */
export interface MHttpResult {
  /**请求结果编码 */
  status: number;
  /**请求结果头 */
  headers: Record<string, any>;
  /**请求结果数据 */
  data: any;
}

/**#################################################↑↑↑↑↑请求相关↑↑↑↑↑######################################################## */
/**#################################################↓↓↓↓↓数据相关↓↓↓↓↓######################################################## */
//#region 数据相关

/**可索引访问对象 */
interface IIndexer {
  [key: string]: any;
}

/**swagger项目信息 */
export interface ISwgInfo extends IIndexer {
  /**项目标题 */
  title: string;
  /**项目版本 */
  version: string;
  /**项目描述 */
  description?: string;
}
/**swagger的schema对象 */
export interface ISwgSchema extends IIndexer {
  /**类型 */
  type?: string;
  /**格式 */
  format?: string;
  /**可为空 */
  nullable?: boolean;
  /**描述 */
  description?: string;
  /**项目 */
  items?: ISwgSchema;
  /**属性集 */
  properties?: { [key: string]: ISwgSchema };
  /**推测 */
  schema?: ISwgSchema;
  /**附加属性 */
  additionalProperties?: ISwgSchema;
  /**引用 */
  $ref?: string;
}

/**swagger的schema容器 */
export interface ISchemaBox {
  schema: ISwgSchema;
}

/**swagger的parameter */
export interface ISwgParamter extends IIndexer {
  /**参数位置 */
  in: string;
  /**参数名称 */
  name: string;
  /**参数备注 */
  description: string;
  /**参数类型 */
  type: string;
  /**参数格式 */
  format: string;
  /**是否允许为空 */
  nullable?: boolean;
  /**参数引用推测 */
  schema: ISwgSchema;
}
/**swagger的响应数据 */
export interface ISwgResponse {
  /**描述信息 */
  description?: string;
  /**2.x响应内容 */
  schema?: ISwgSchema;
  /**3.x响应内容 */
  content?: {
    "text/json"?: ISchemaBox;
    "application/json"?: ISchemaBox;
    "application/*+json"?: ISchemaBox;
    "multipart/form-data"?: ISchemaBox;
  };
}
/**swagger的请求/返回body数据 */
export interface ISwgBody extends IIndexer {
  /**描述信息 */
  description?: string;
  /**3.x发送内容 */
  content?: {
    "text/json"?: ISchemaBox;
    "application/json"?: ISchemaBox;
    "application/*+json"?: ISchemaBox;
    "multipart/form-data"?: ISchemaBox;
  };
}

/**响应枚举 */
export interface ISwaggerResponses extends IIndexer {
  "200": ISwgBody;
  "401"?: ISwgBody;
  "403"?: ISwgBody;
  "500"?: ISwgBody;
}

/**swagger的method对象 */
export interface ISwgMethod extends IIndexer {
  /**方式名称 */
  method: string;
  /**请求地址 */
  path: string;
  /**请求分组 */
  group: string;
  /**请求分组标签 */
  tags: Array<string>;
  /**备注信息 */
  summary?: string;
  /**接口别名 */
  operationId?: string;
  /**参数列表 */
  parameters?: Array<ISwgParamter>;
  /**提交数据 */
  requestBody?: ISwgBody;
  /**响应枚举对象 */
  responses: ISwaggerResponses;
  /**授权描述 */
  security?: Array<{ [key: string]: Array<string> }>;
}

/**swagger的Path对象 */
export interface ISwgPath extends IIndexer {
  /**get请求方式 */
  get?: ISwgMethod;
  /**put请求方式 */
  put?: ISwgMethod;
  /**post请求方式 */
  post?: ISwgMethod;
  /**delete请求方式 */
  delete?: ISwgMethod;
}

/**swagger的paths */
export interface ISwgPaths {
  [key: string]: ISwgPath;
}

/**swagger的Defintion或components.scheme */
export interface ISwgDefine {
  /**定义名称 */
  name: string;
  /**定义类型 */
  type: string;
  /**必填项 */
  required?: Array<string>;
  /**定义描述 */
  description?: string;
  /**定义枚举内容 */
  enum?: Array<string | number>;
  /**定义属性列表 */
  properties?: { [key: string]: ISwgSchema };
}

/**swagger的denintions */
export interface ISwgDefines {
  [key: string]: ISwgDefine;
}

/**swagger的components */
export interface ISwgComponents {
  schemas: ISwgDefines;
  /**3.x授权信息定义 */
  securitySchemes: any;
}

/**swagger数据信息 */
export interface ISwagger extends IIndexer {
  /**版本号 1*/
  openapi?: string;
  /**版本号 2*/
  swagger?: string;
  /**项目信息 */
  info?: ISwgInfo;
  /**请求信息 */
  paths?: ISwgPaths;
  /**2.x模型信息 1 */
  definitions?: ISwgDefines;
  /**3.x模型信息 2 */
  components?: ISwgComponents;
  /**2.x授权信息定义 */
  securityDefinitions?: any;
  /**分组描述 */
  tags?: Array<{ name: string; description: string }>;
}

/**#################################################↑↑↑↑↑数据相关↑↑↑↑↑######################################################## */
/**#################################################↓↓↓↓↓解析相关↓↓↓↓↓######################################################## */
//#region 解析相关

/**类型对象 */
export interface IType {
  /**类型的值 */
  type: string;
  /**类型描述 */
  description: string;
  /**类型格式 */
  format?: string;
  /**是否可为空 */
  nullable?: boolean;
  /**是否枚举 */
  isEnum?: boolean;
  /**枚举类型 */
  enumType?: string;
}

/**参数类型 */
export interface IParm {
  /**参数名称 */
  name: string;
  /**参数类型链 */
  type: Array<IType>;
  /**是否在路径中 */
  inPath: boolean;
  /**参数备注 */
  description: string;
  /**是否必填 */
  required?: boolean;
  /**是否可为空 */
  nullable?: boolean;
}

/**属性对象 */
export interface IProp {
  /**属性名称 */
  name: string;
  /**属性备注 */
  description: string;
  /**属性类型链 */
  type: Array<IType>;
  /**是否必填 */
  required?: boolean;
  /**可为空 */
  nullable?: boolean;
}

/**中间模型类型 */
export interface IModel {
  /**模型名称 */
  name: string;
  /**是否枚举类型 */
  isEnum: boolean;
  /**模型描述 */
  description: string;
  /**模型属性 */
  props: Array<IProp>;
}

/**解析结果的请求连接地址 */
export interface IParsedUrl {
  /**连接名称 */
  name: string;
  /**连接地址 */
  value: string;
  /**注释内容 */
  description: string;
}

/**解析结果的请求引用 */
export interface IParsedUse {
  /**模型名称 */
  name: string;
  /**文件名称 */
  file: string;
  /**是否枚举类型 */
  isEnum?: boolean;
}

/**解析结果的请求函数对象 */
export interface IReqMethod {
  /**注释内容 */
  description: string;
  /**函数名称 */
  name: string;
  /**请求路径 */
  path: string;
  /**连接名称 */
  urlName: string;
  /**请求方式 */
  method: string;
  /**入参列表 */
  inputParms: Array<IParm>;
  /**入参模型名称 */
  inputModel: Array<IType>;
  /**出参模型名称 */
  outputModel: Array<IType>;
}

/**解析结果的接口数据 */
export interface IParsedMethod {
  /**项目名称 */
  base: string;
  /**分组名称 */
  group: string;
  /**请求连接列表 */
  urls: Array<IParsedUrl>;
  /**请求使用到的模型列表 */
  uses: Array<IParsedUse>;
  /**请求函数列表 */
  funcs: Array<IReqMethod>;
}

/**解析结果的模型数据 */
export interface IParsedModel {
  /**模型名称 */
  name: string;
  /**枚举备注 */
  description: string;
  /**使用到的子模型列表 */
  uses: Array<IParsedUse>;
  /**属性列表 */
  props: Array<IProp>;
}

/**解析结果的枚举数据 */
export interface IParsedEnum {
  /**枚举名称 */
  name: string;
  /**枚举类型 */
  type: string;
  /**枚举备注 */
  description: string;
  /**枚举属性 */
  props: Array<{ key: string; value: string | number }>;
}

/**解析结果 */
export interface IParsedResult {
  /**接口部分 */
  methods: Array<IParsedMethod>;
  /**模型部分 */
  models: Array<IParsedModel>;
  /**枚举部分 */
  enums: Array<IParsedEnum>;
}

/**#################################################↑↑↑↑↑解析相关↑↑↑↑↑######################################################## */
